package com.enjoyor.soa.traffic.frame.support.solr;

import java.util.List;
import java.util.Map;

import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;

import com.enjoyor.soa.traffic.util.pojo.Page;

public interface ISolrService {

    /**
     * 插入或修改数据(Object中属性需配置@Field注解)
     * 
     * @param coreName
     *            核心名称
     * @param Object
     *            数据封装
     */
    public boolean save(String coreName, Object object);

    /**
     * 插入或修改数据
     * 
     * @param coreName
     *            核心名称
     * @param map(k,v
     *            键值对形式表示对象) 数据封装
     */
    public boolean save(String coreName, Map<String, Object> map);

    /**
     * 插入或修改数据(利用反射插入数据,不需要@Field修饰每个类属性,若有@Field修饰,则采用Field中value值)
     * 
     * @param coreName
     *            核心名称
     * @param Object
     *            数据封装
     */
    public boolean saveByReflect(String coreName, Object object);

    /**
     * 批量插入或修改数据
     *
     * @param coreName
     * @param list
     * @return
     */
    public int batchSave(String coreName, List<Object> list);

    /**
     * 按Id号删除
     * 
     * @param coreName
     * @param id
     */
    public boolean deleteById(String coreName, String id);

    /**
     * 按Id数组号删除
     * 
     * @param coreName
     * @param ids
     */
    public int deleteById(String coreName, List<String> ids);

    /**
     * 按具体条件删除
     * 
     * @param coreName
     * @param query
     */
    public boolean deleteByQuery(String coreName, String query);

    /**
     * 删除核心名称下所有数据
     * 
     * @param coreName
     */
    public boolean deleteAll(String coreName);

    /**
     * 查询所有数据
     * 
     * @param coreName
     *            核心名称
     */
    public SolrDocumentList selectAll(String coreName);

    /**
     * 查询所有数据
     * 
     * @param coreName
     *            核心名称
     * @param clazz
     *            实例化类类型
     */
    public List<Object> selectAll(String coreName, Class<?> clazz);

    /**
     * 按id查询数据
     * 
     * @param coreName
     *            核心名称
     * @param id
     *            id
     */
    public SolrDocument selectById(String coreName, String id);

    /**
     * 按id查询数据
     * 
     * @param coreName
     *            核心名称
     * @param id
     *            id
     * @param clazz
     *            实例化类类型
     */
    public Object selectById(String coreName, String id, Class<?> clazz);

    /**
     * 按条件查询搜索引擎
     * 
     * @param coreName
     *            核心名称
     * @param filterQuerys(可为null,为null则查询全部)
     *            查询条件
     */
    public SolrDocumentList selectList(String coreName, String... filterQuerys);

    /**
     * 按条件查询搜索引擎
     * 
     * @param coreName
     *            核心名称
     * @param filterQuerys(可为null,为null则查询全部)
     *            查询条件
     * @param clazz
     *            实例化类类型
     */
    public List<Object> selectList(String coreName, Class<?> clazz, String... filterQuerys);

    /**
     * 按条件查询搜索引擎
     * 
     * @param query(可为null,为null则查询全部)
     *            查询条件
     * @param coreName
     *            核心名称
     * @param 基本查询一.基本查询

　　q  查询的关键字，此参数最为重要，例如，q=id:1，默认为q=*:*，

　　fl  指定返回哪些字段，用逗号或空格分隔，注意：字段区分大小写，例如，fl= id,title,sort(可为null,为null则查询全部)
     *            过滤条件
     */
    public SolrDocumentList selectList(String coreName, String query, String... filterQuerys);

    /**
     * 按条件查询搜索引擎
     * 
     * @param query(可为null,为null则查询全部)
     *            查询条件
     * @param coreName
     *            核心名称
     * @param filterQuerys(可为null,为null则查询全部)
     *            过滤条件
     * @param clazz
     *            实例化类类型
     */
    public List<Object> selectList(String coreName, String query, Class<?> clazz, String... filterQuerys);

    /**
     * 按条件查询搜索总量
     * 
     * @param query(可为null,为null则查询全部)
     *            查询条件
     * @param coreName
     *            核心名称
     * @param filterQuerys(可为null,为null则查询全部)
     *            过滤条件
     */
    public int selectCount(String coreName, String query, String... filterQuerys);

    /**
     * 按条件查询，分页
     * 
     * @param coreName
     *            核心名称
     * @param query(可为null,为null则查询全部)
     *            查询条件
     * @param page
     *            page对象
     * @param filterQuerys(可为null,为null则查询全部)
     *            过滤条件
     * @return
     */
    @SuppressWarnings("rawtypes")
    public Page selectPage(String coreName, String query, Page page, String... filterQuerys);

}
